﻿#define _CRT_SECURE_NO_WARNINGS 1
//给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积 。
//题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。
//请不要使用除法,且在O(n)时间复杂度内完成此题。
//#include <stdio.h>
//#include <stdlib.h>
//#include <assert.h>
//
//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    int* answer = (int*)malloc(sizeof(int) * numsSize);
//    *returnSize = numsSize;
//    int* leftMul = (int*)malloc(sizeof(int) * numsSize);
//    int* rightMul = (int*)malloc(sizeof(int) * numsSize);
//    assert(leftMul && rightMul && answer);
//    leftMul[0] = 1;
//    for (int i = 1; i < numsSize; i++)
//    {
//        leftMul[i] = leftMul[i - 1] * nums[i - 1];
//    }
//    rightMul[numsSize - 1] = 1;
//    for (int j = numsSize - 2; j >= 0; j--)
//    {
//        rightMul[j] = rightMul[j + 1] * nums[j + 1];
//    }
//
//    for (int i = 0; i < numsSize; i++)
//    {
//        answer[i] = leftMul[i] * rightMul[i];
//    }
//    free(leftMul);
//    free(rightMul);
//    leftMul = NULL;
//    rightMul = NULL;
//
//    return answer;
//}
//
//int main()
//{
//    int arr[] = { 1,2,3,4 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int size = 0;
//    int* ret = productExceptSelf(arr, sz, &size);
//    for (int i = 0; i < size; i++)
//    {
//        printf("%d ", ret[i]);
//    }
//    printf("\n");
//    free(ret);
//    ret = NULL;
//	
//	return 0;
//}
//写一个函数，求两个整数之和，要求在函数体内不得使用+、-、*、/四则运算符号。
//数据范围：两个数都满足
//−10≤n≤1000进阶：空间复杂度O(1)O(1)，时间复杂度O(1)O(1)
//#include <stdio.h>
//
//int Add(int num1, int num2)
//{
//    while (num1)//num1不为0就表示还有进位
//    {
//        int tmp = num1 ^ num2; //计算不算进位的相加结果
//        num1 = (num1 & num2) << 1;//计算有进位的位置，左移1就将进位移到它该在的位置
//        num2 = tmp; //将没进位的结果交给num2，直到进位为0，结束计算
//    }
//    return num2;
//}
//
//int main()
//{
//    int x = 1;
//    int y = 2;
//    int ret = Add(x, y);
//    printf("%d\n",ret);
//
//	return 0;
//}
//给你一个含n个整数的数组nums，其中nums[i]在区间[1,n]内。
//请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。
//#include <stdio.h>
//#include <stdlib.h>
//#include <assert.h>
//
// 方法一:
//int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
//    int* ret = (int*)malloc(sizeof(int) * numsSize);
//    assert(ret);
//    int tmp = 0;
//    for (int i = 1; i <= numsSize; i++)
//    {
//        int count = 0;
//        for (int j = 0; j < numsSize; j++)
//        {
//            if ((nums[j] ^ i )== 0)
//            {
//                count++;
//            }
//        }
//        if (!count)
//        {
//            ret[tmp] = i;
//            tmp++;
//        }
//    }
//    *returnSize = tmp;
//    return ret;
//}
//方法二:
//int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    //int* ret = (int*)malloc(sizeof(int) * numsSize);
    //assert(ret);
    //for (int i = 0; i < numsSize; i++)
    //{
    //    int tmp = (nums[i] - 1) % numsSize;
    //    nums[tmp] += numsSize;
    //}

    //*returnSize = 0;
    //for (int j = 0; j < numsSize; j++)
    //{
    //    if (nums[j] <= numsSize)
    //    {
    //        ret[(*returnSize)++] = j + 1;
    //    }
    //}
    //return ret;
//}
//
//int main()
//{
//    int arr[] = { 4,3,2,7,8,2,3,1 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int size = 0;
//    int* ret = findDisappearedNumbers(arr, sz, &size);
//    for (int i = 0; i < size; i++)
//    {
//        printf("%d ", ret[i]);
//    }
//    printf("\n");
//
//    return 0;
//}
//给定一个二进制数组nums，计算其中最大连续1的个数。
//输入：nums = [1,1,0,1,1,1]
//输出：3
//解释：开头的两位和最后的三位都是连续1，所以最大连续1的个数是3.
//#include <stdio.h>
//#include <math.h>
//
//int findMaxConsecutiveOnes(int* nums, int numsSize) {
//    int max = 0;
//    int max1 = 0;
//    int i = 0;
//    for (i = 0; i < numsSize; i++)
//    {
//        if (nums[i] == 1)
//            max++;
//        else
//        {
//            max1 = fmax(max, max1);
//            max = 0;
//        }
//    }
//
//    return max1 > max ? max1 : max;
//}
//
//int main()
//{
//    int arr[] = { 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int ret = findMaxConsecutiveOnes(arr, sz);
//    printf("%d\n", ret);
//
//    return 0;
//}